/*
 * Copyright 2009 Tran Nhut Trung.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.gdevelop.gwtxp.rebind.gwt;


import com.gdevelop.gwtxp.rebind.AbstractTag;
import com.gdevelop.gwtxp.rebind.Tag;
import com.gdevelop.gwtxp.rebind.el.ELParser;
import com.gdevelop.gwtxp.rebind.el.Node;

import com.google.gwt.core.ext.typeinfo.NotFoundException;
import com.google.gwt.user.client.ui.MenuItem;

import org.w3c.dom.Attr;


public class MenuItemTag extends AbstractTag{
  public MenuItemTag() {
  }

  public Class getUIClass() {
    return MenuItem.class;
  }

  public void generateDeclaration() throws NotFoundException {
    String text = this.getAttribute("text");
    String html = this.getAttribute("HTML");
    if ((text == null) && (html == null)){
      throw new RuntimeException("MenuItem must have text or html attribute.");
    }

    boolean hasSubMenu = false;
    if (children.size() > 0){
      hasSubMenu = true;
    }
    String className = this.getUIClass().getSimpleName();
    if (text != null){
      Node elNode = ELParser.parse(text);
      out.println(className + " " + varName + " = new " + className+ "(" + elNode.generateGetExpression(elContext) + (hasSubMenu ? ", new MenuBar());" : ", (Command)null);"));
    }else{
      Node elNode = ELParser.parse(html);
      out.println(className + " " + varName + " = new " + className+ "(" + elNode.generateGetExpression(elContext) + ", true, " + (hasSubMenu ? ", new MenuBar());" : ", (Command)null);"));
    }
  }

  public void generateAddUI(Tag child) {
    out.println(varName + ".setSubMenu(" + child.getVarName() + ");");
  }
  
  protected void generateValueBinding(Attr attr) throws NotFoundException {
    if ("command".equals(attr.getLocalName())){
      super.generateSetAttributeByExpression(attr);
    }else{
      super.generateValueBinding(attr);
    }
  }
  
  protected void generateMethodBinding(Attr attr) throws NotFoundException {
    if ("onCommand".equals(attr.getLocalName())){
      Node node = ELParser.parse(attr.getValue());
      node = node.jjtGetChild(0);
      
      out.println(varName + ".setCommand(new Command(){");
      out.indent();
      out.println("public void execute(){");
      out.indent();
      if (attr.getValue().startsWith("#{#")){
        String token = attr.getValue().substring(3, attr.getValue().length()-1);
        out.println("History.newItem(\"" + token + "\", true);");
      }else{
        out.println(node.jjtGetParent().generateMethodBinding(elContext));
      }
      out.outdent();
      out.println("}");
      out.outdent();
      out.println("});");
    }else{
      super.generateMethodBinding(attr);
    }
  }
}
